package bootstrap

import (
	"github.com/bwmarrin/snowflake"
	"github.com/redis/go-redis/v9"
	"github.com/spf13/viper"
	"go.uber.org/zap"
	"gorm.io/gorm"
	"xincan.com.cn/tarot-go/internal/common/types"
	"xincan.com.cn/tarot-go/internal/components/logging"
	"xincan.com.cn/tarot-go/internal/components/validator"
	config "xincan.com.cn/tarot-go/internal/config"
)

// 全局共用变量
var (
	App      *types.Service       // 应用配置
	Viper    *viper.Viper         // 远程配置
	Logger   *logging.TraceLogger // 日志
	Sugar    *zap.SugaredLogger   // 日志
	Node     *snowflake.Node      // 雪花算法
	Validate *validator.Validator // 验证配置信息
	Cache    *redis.Client        // 缓存
	DB       *gorm.DB             // 数据库客户端
)

// InitBootstrapApplication
// Title    			InitBootstrapApplication
// Description   		初始化tarot全局变量
// Author      			alittlexincan@163.com       			2024/07/22 11:36
// Update    			alittlexincan@163.com       			2024/07/22 11:36
func InitBootstrapApplication() {

	// 1: 初始化全局配置, 获取整体配置实例
	bootstrap := config.NewApplicationConfigBuilder().WidthLogger().Build()

	// 2: 初始化加载日志实例
	Logger, Sugar = bootstrap.LoggerLoad()

	// 3: 获取全局参数配置实例、viper实例
	App, Viper = bootstrap.ConfigLoad()

	// 4: 初始化雪花算法实例
	Node = bootstrap.IdLoad()

	// 5: 获取全局参数验证实例
	Validate = bootstrap.ValidateLoad()

	// 6: 初始化加载缓存实例
	Cache = bootstrap.CacheLoad()

	// 7: 初始化对象关系实例
	DB = bootstrap.OrmLoad()

	// 8: 初始化加载注册服务实例
	bootstrap.RegistryLoad()

	// 9: 监听远程配置信息
	go bootstrap.WatchRemoteConfigLoad(func(watchViper *viper.Viper) {
		App = bootstrap.MergeWatchRemoteConfigLoad(watchViper)
	})
}
